package mysql

import (
	"bluebell/models"
	"crypto/md5"
	"database/sql"
	"encoding/hex"
	"fmt"
	"go.uber.org/zap"
)

// 把每一步数据库操作封装成函数
// 待logic层根据业务需求调用

const secret = "liwenzhou.com"

func UpdateUserUsername(userID int64, username string) error {
	sqlStr := `UPDATE user SET username = ? WHERE id = ?`
	_, err := db.Exec(sqlStr, username, userID)
	return err
}

// UpdateUserAvatar 更新用户头像URL到数据库
// 参数：
//   - userID: 要更新的用户ID
//   - avatar: 头像图片的URL地址
//
// 返回值：
//   - error: 操作失败时返回错误信息，成功时返回nil
func UpdateUserAvatar(userID int64, avatar string) error {
	// SQL语句（注意表名和字段名要与数据库实际结构一致）
	sqlStr := `UPDATE user SET avatar = ? WHERE user_id = ?`

	// 执行SQL并记录调试信息
	zap.L().Debug("准备执行头像更新SQL",
		zap.String("sql", sqlStr),
		zap.Int64("userID", userID),
		zap.String("avatar", avatar))

	// 执行数据库操作
	result, err := db.Exec(sqlStr, avatar, userID)
	if err != nil {
		zap.L().Error("更新头像SQL执行失败",
			zap.Error(err),
			zap.Int64("userID", userID))
		return err
	}

	// 检查实际影响行数
	rowsAffected, _ := result.RowsAffected()
	zap.L().Info("头像更新成功",
		zap.Int64("userID", userID),
		zap.Int64("affectedRows", rowsAffected),
		zap.String("newAvatar", avatar))

	// 验证是否确实更新了记录
	if rowsAffected == 0 {
		zap.L().Warn("未找到匹配的用户记录",
			zap.Int64("userID", userID))
		// 可以返回自定义错误，如：return errors.New("user not found")
	}

	return nil
}

// CheckUserExist 检查指定用户名的用户是否存在
func CheckUserExist(username string) (err error) {
	sqlStr := `select count(user_id) from user where username = ?`
	var count int64
	if err := db.Get(&count, sqlStr, username); err != nil {
		return err
	}
	if count > 0 {
		return ErrorUserExist
	}
	return
}

// InsertUser 想数据库中插入一条新的用户记录
func InsertUser(user *models.User) (err error) {
	// 对密码进行加密
	user.Password = encryptPassword(user.Password)
	// 执行SQL语句入库
	sqlStr := `insert into user(user_id, username, password) values(?,?,?)`
	_, err = db.Exec(sqlStr, user.UserID, user.Username, user.Password)
	return
}

// encryptPassword 密码加密
func encryptPassword(oPassword string) string {
	h := md5.New()
	h.Write([]byte(secret))
	return hex.EncodeToString(h.Sum([]byte(oPassword)))
}

func Login(user *models.User) (err error) {
	oPassword := user.Password // 用户登录的密码
	sqlStr := `select user_id, username, password from user where username=?`
	err = db.Get(user, sqlStr, user.Username)
	if err == sql.ErrNoRows {
		return ErrorUserNotExist
	}
	if err != nil {
		// 查询数据库失败
		return err
	}
	fmt.Println(user)
	// 判断密码是否正确
	password := encryptPassword(oPassword)
	if password != user.Password {
		return ErrorInvalidPassword
	}
	return
}

// GetUserById 根据id获取用户信息
func GetUserById(uid int64) (user *models.User, err error) {
	user = new(models.User)
	sqlStr := `select user_id, username from user where user_id = ?`
	err = db.Get(user, sqlStr, uid)
	return
}

func DeleteUser(userID int64) (err error) {
	sqlstr := `delete from user where user_id = ?`
	_, err = db.Exec(sqlstr, userID)
	if err != nil {
		return err
	}
	return
}
